<?php

/**
 * action  对像接口
 *
 */
abstract class cron {
	
	/**
	 * 当前系统的 request 对像，保存有所有的查询数据
	 */
	public $request = null;
	/**
	 * 当前系统的 view 对像，实际上是 template 对的一个扩展
	 */
	public $view = null;
	
	/**
	 * 设置 request 对像
	 *
	 * @param s $request
	 *        	request参数对像
	 */
	function setRequest($request) {
		$this->request = $request;
	}
	
	/**
	 * 设置 view 模板对像
	 *
	 * @param s $view
	 *        	模板对像
	 */
	function setView($view) {
		$this->view = $view;
	}
	
	/**
	 * 事件执行入口，在 application 的 dispatch 入口调用
	 */
	function process() {
		if (method_exists ( $this, 'runFirst' )) {
			
			$this->runFirst (); // action的runFirst
		}
		
		// get file name
		$arg = $_SERVER ['argv'];
		array_shift ( $arg );
		$fileName = _APP_ROOT . 'cron/action/' . $arg [0] . '.php';
		require_once $fileName;
		
		// get class name
		$className = array_shift ( $arg );
		$_class = new $className ();
		
		// get function name
		$_function = array_shift ( $arg );
		
		if (! method_exists ( $_class, $_function )) {
			die ( "请在类" . get_class ( $_class ) . " 中实现方法 $_function" );
		} else {
			$strArgs = self::getArg ( $arg );
			$this->$_function ( $arg );
		}
		
		if (method_exists ( $this, 'runLast' )) {
			
			$this->runLast (); // action的runLast
		}
	}
	
	// function process() {
	// if (method_exists($this, 'runFirst')) {
	// $this->runFirst();
	// }
	
	// $arg = $_SERVER['argv'];
	// array_shift($arg);
	// $fileName = _APP_ROOT.'cron/action/'.$arg[0].'.php';
	// require_once $fileName;
	
	// $className = array_shift($arg);
	// $action_class= new $className;
	
	// $methodName = array_shift($arg);
	
	// $args = self::getArg($arg);
	// print_r($args);exit;
	// $this->$methodName($arg);
	// // $Reflection=new ReflectionMethod($action_class, $methodName);
	// // $methods = $Reflection->getParameters();
	// // $args = self::getInvokeArgs($args, $methods);
	// // print_r($args);exit;
	// // $Reflection->invokeArgs($action_class, $args);
	
	// if(method_exists($this, 'runLast')) {
	
	// $this -> runLast(); //action的runLast
	// }
	// }
	
	/**
	 * 按变量顺序,组装反射用数组
	 *
	 * @param type $args        	
	 * @param type $methods        	
	 * @return type
	 */
	private function getInvokeArgs($args, $methods) {
		$result = array ();
		foreach ( $methods as $value ) {
			
			if (isset ( $args [$value->name] )) {
				
				$result [$value->name] = $args [$value->name];
			}
		}
		return $result;
	}
	
	/**
	 * 拆分传入参数为数组
	 *
	 * @param type $arg        	
	 * @return type
	 */
	private function getArg($arg) {
		
		// 拆分传入的字符串
		$args = array ();
		foreach ( $arg as $value ) {
			
			$v = explode ( '=', $value );
			$args [$v [0]] = $v [1];
		}
		
		// 曾加额外处理
		$strArgs = implode ( ',', array_values ( $args ) );
		return $strArgs;
	}
}
?>